#ifndef OBJET_H
#define OBJET_H

#include "structures.h"
#include "Rayon.h"
#include "Matrice.h"
#include "Texture.h"

class Intersection;
class Boite;

class Objet{
public:
	Objet();
	Objet(Matrice transformationObjetGlobal);
	virtual ~Objet();
	virtual bool intersection(Rayon &r, Intersection &i) = 0;
	virtual Couleur getCouleur() const ;
	virtual Couleur getCouleur(const Intersection& i) const ;
	virtual void setCouleur(Couleur c);
	Couleur getSpecularite() const {return specularite;}
	float getCoeffRugosite() const {return coeffRugosite;}
	float getCoeffDiffusion() const {return coeffDiffusion;}
	float getCoeffSpecularite() const {return coeffSpecularite;}
	float getCoeffReflexion() const {return coeffReflexion;}
	float getCoeffTransparence() const {return coeffTransparence;};
	virtual float getCoeffTransparence(const Point& p) const {return coeffTransparence;};
	float getIndiceMilieu() const {return indiceMilieu;}
    void setSpecularite(const Couleur &c) {specularite=c;}
	void setCoeffRugosite(float c);
	void setCoeffDiffusion(float c);
	void setCoeffSpecularite(float c);
	void setCoeffReflexion(float c);
	virtual void setCoeffTransparence(float c);
	void setIndiceMilieu(float c);
	void setSpecularite(Couleur c);
	void setAbsorbe(bool val){ absorbe = val; };
	void setBoiteEnglobante(Boite *b);
	Boite* getBoiteEnglobante();
	void setTexture(Texture* t){ texture = t; } ;
	inline void setModeTexture(Type_Texture mode) { modeTexture = mode; };
	void Objet::changementRepereMatriceObjet(Matrice &matriceRepere);
	virtual Point getCentre() const {return centre; } ;
	virtual Point getCentreObjet() {return transformationGlobalObjet * centre; } ;

	virtual void planarTextureCoordonnees(float& u, float& v, const Point& centre, const Point& point, Matrice* rotation = NULL) const;
	virtual void cylindralTextureCoordonnees(float& u, float& v, const Point& centre, const Point& point, Matrice* rotation = NULL) const {};
	virtual void initialiserBoiteEnglobante();
	void ajouterPointDansBoiteEnglobante(Point &p);
	Matrice getTransformationObjetGlobal() const { return Matrice(transformationObjetGlobal); };
	Matrice getTransformationGlobalObjet() const { return Matrice(transformationGlobalObjet); };


protected:
	
	float coeffRugosite;
	float coeffDiffusion;
	float coeffSpecularite;
	float coeffReflexion;
	float coeffTransparence;
	float indiceMilieu;
	bool absorbe;
	Couleur couleur;
	Intersection* inter_;
	Couleur specularite;
	Boite *boiteEnglobante;
	Texture* texture;
	Point centre;

	Matrice transformationObjetGlobal;
	Matrice transformationGlobalObjet;

	Type_Texture modeTexture;
};

#endif
